package com.jt.service;
/**用于上传文件*/
import com.jt.mapper.FileMapper;
import com.jt.vo.ImageVO;
import com.jt.vo.SysResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService{
    @Autowired
    private FileMapper fileMapper;

    //定义根目录  winddows系统采用改目录  Linux系统需要切换目录
//    private String proFilePath = "C:/Users/dinghao/Desktop/Demo";
    private String proFilePath = "/usr/local/src/images";  //Linux 系统项目部署
    private String preURLPath = "http://image.jt.com";//定义网络地址前缀
    /**
     * 业务思路:
     *      1.校验图片的类型  jpg/png/gif
     *      2.校验是否为恶意程序   木马.exe.jpg
     *      3.将图片进行分目录储存  hash方式储存/时间格式储存
     *      4.防止图片重名,使用UUID
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.获取文件名称 abc.JPG
        //2.bug : 文件名称大小写问题  全部转化为小写
        //3.  matches 正则表达式
        //  getOriginalFilename() 获取文件名
        //  toLowerCase()  转小写
        String fileName = file.getOriginalFilename().toLowerCase(); //获取文件名 名称转小写
        if (!fileName.matches("^.+\\.(jpg|png|gif)$")){
            //如果图片不满足条件,则程序终止
            return null;
        }

        //第二部: 校验是否为恶意程序
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());//获取图片
            int height = bufferedImage.getHeight();//获取图片高度  不能为0
            int width = bufferedImage.getWidth();//获取图片宽度   不能为0
            if (height == 0 || width == 0){
                return null;
            }

            //第三步: 分类 分目录存储: 提高检索效率 按照时间将目录划分 /yyyy/MM/dd/
            //获取时间,将时间转换成字符串 ,然后进行拼接
            String datePath = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //C:/Users/dinghao/Desktop/Demo/yyyy/MM/dd/
            String fileDir = proFilePath + datePath;
            //创建目录
            File dirFile = new File(fileDir); //新建一个目录对象
            if (!dirFile.exists()){ //判断目录存不存在 如果不存在就创建目录
                dirFile.mkdirs(); //创建目录
            }

            //第四步: 防止重名
            String uuid = UUID.randomUUID().toString().replace("-","");
            int index = fileName.lastIndexOf(".");//获取最后一个 . 的下标
            String fileType = fileName.substring(index);//按下标进行截取 .jpg
            //新文件名
            fileName = uuid + fileType;

            //第五步 : 实现文件上传
            //C:/Users/dinghao/Desktop/Demo/yyyy/MM/dd/uuid.jpg
            String filePath = fileDir + fileName;
            file.transferTo(new File(filePath));

            //第六步 封装ImageVO 返回数据
            //  /yyyy/MM/dd/ + fileName = uuid + fileType
            String virtualPath = datePath + fileName; //动态变化的路径 虚拟路径

            //第七部 封装网络地址
            String urlPath = preURLPath + virtualPath; //网络地址
            System.out.println(urlPath);

            return new ImageVO(virtualPath,urlPath,fileName);


        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    //根据路径删除图片
    //virtualPath 表示动态变化的路径
    //路径拼接: 磁盘路径 + 变化路径
    @Override
    public void deleteFile(String virtualPath) {
        String deleteFilePath =  proFilePath + virtualPath;
        File file = new File(deleteFilePath);
        if (file.exists()){  //文件是否存在
            file.delete();
        }
    }


}
